package com.ruoyi.basebill.service.impl;

import java.math.BigDecimal;
import java.util.List;

import com.alibaba.fastjson.JSONObject;
import com.ruoyi.basebill.DTO.SbjrInfo;
import com.ruoyi.basebill.DTO.SbjrEntryInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.basebill.domain.WfzSbjrentry;
import com.ruoyi.basebill.mapper.WfzSbjrMapper;
import com.ruoyi.basebill.domain.WfzSbjr;
import com.ruoyi.basebill.service.IWfzSbjrService;

/**
 * 社保缴纳Service业务层处理
 * 
 * @author xiefeng
 * @date 2023-01-03
 */
@Service
public class WfzSbjrServiceImpl implements IWfzSbjrService 
{
    @Autowired
    private WfzSbjrMapper wfzSbjrMapper;

    /**
     * 查询社保缴纳
     * 
     * @param fid 社保缴纳主键
     * @return 社保缴纳
     */
    @Override
    public WfzSbjr selectWfzSbjrByFid(Long fid)
    {
        return wfzSbjrMapper.selectWfzSbjrByFid(fid);
    }

    /**
     * 查询社保缴纳列表
     * 
     * @param wfzSbjr 社保缴纳
     * @return 社保缴纳
     */
    @Override
    public List<WfzSbjr> selectWfzSbjrList(WfzSbjr wfzSbjr)
    {
        return wfzSbjrMapper.selectWfzSbjrList(wfzSbjr);
    }

    /**
     * 新增社保缴纳
     * 
     * @param wfzSbjr 社保缴纳
     * @return 结果
     */
    @Transactional
    @Override
    public int insertWfzSbjr(WfzSbjr wfzSbjr)
    {
        int rows = wfzSbjrMapper.insertWfzSbjr(wfzSbjr);
        insertWfzSbjrentry(wfzSbjr);
        return rows;
    }

    /**
     * 修改社保缴纳
     * 
     * @param wfzSbjr 社保缴纳
     * @return 结果
     */
    @Transactional
    @Override
    public int updateWfzSbjr(WfzSbjr wfzSbjr)
    {
        wfzSbjrMapper.deleteWfzSbjrentryByFparentid(wfzSbjr.getFid());
        insertWfzSbjrentry(wfzSbjr);
        return wfzSbjrMapper.updateWfzSbjr(wfzSbjr);
    }

    /**
     * 批量删除社保缴纳
     * 
     * @param fids 需要删除的社保缴纳主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteWfzSbjrByFids(Long[] fids)
    {
        wfzSbjrMapper.deleteWfzSbjrentryByFparentids(fids);
        return wfzSbjrMapper.deleteWfzSbjrByFids(fids);
    }

    /**
     * 删除社保缴纳信息
     * 
     * @param fid 社保缴纳主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteWfzSbjrByFid(Long fid)
    {
        wfzSbjrMapper.deleteWfzSbjrentryByFparentid(fid);
        return wfzSbjrMapper.deleteWfzSbjrByFid(fid);
    }

    /**
     * 新增社保缴纳明细信息
     * 
     * @param wfzSbjr 社保缴纳对象
     */
    public void insertWfzSbjrentry(WfzSbjr wfzSbjr)
    {
        List<WfzSbjrentry> wfzSbjrentryList = wfzSbjr.getWfzSbjrentryList();
        Long fid = wfzSbjr.getFid();
        if (StringUtils.isNotNull(wfzSbjrentryList))
        {
            List<WfzSbjrentry> list = new ArrayList<WfzSbjrentry>();
            for (WfzSbjrentry wfzSbjrentry : wfzSbjrentryList)
            {
                wfzSbjrentry.setFparentid(fid);
                list.add(wfzSbjrentry);
            }
            if (list.size() > 0)
            {
                wfzSbjrMapper.batchWfzSbjrentry(list);
            }
        }
    }

    /**
     * 导入社保缴纳的方法
     */
    @Override
    public String importSbjr(WfzSbjr wfzSbjr) {
        SbjrInfo sbjrInfo = new SbjrInfo();
        String fnumber = wfzSbjr.getFnumber();//单据编号
        String fcompany = wfzSbjr.getFcompany();//公司（组织）
        String fperiod = wfzSbjr.getFperiod();//薪酬期间
        BigDecimal fzrs = wfzSbjr.getFzrs();//总人数
        BigDecimal fnscbzxrs = wfzSbjr.getFnscbzxrs();//合并纳税成本中心人数
        BigDecimal fglf = wfzSbjr.getFglf();//关联方人数
        String fvourtype = wfzSbjr.getFvourtype();//凭证字

        sbjrInfo.setNumber(fnumber);
        sbjrInfo.setCompany(fcompany);
        sbjrInfo.setPeriod(fperiod);
        sbjrInfo.setZrs(fzrs);
        sbjrInfo.setNscbzxrs(fnscbzxrs);
        sbjrInfo.setGlf(fglf);
        sbjrInfo.setVourType(fvourtype);
        sbjrInfo.setSourcebillid(String.valueOf(wfzSbjr.getFid()));

        List<WfzSbjrentry> wfzSbjrentryList = wfzSbjr.getWfzSbjrentryList();
        ArrayList<SbjrEntryInfo> entry = new ArrayList<>();
        //组装分录数据
        for (int i = 0; i < wfzSbjrentryList.size(); i++) {
            WfzSbjrentry wfzSbjrentry = wfzSbjrentryList.get(i);
            String fcostnumber = wfzSbjrentry.getFcostnumber();//成本中心
            String fcostcompany = wfzSbjrentry.getFcostcompany();//成本中心所属财务组织
            BigDecimal fylbx = wfzSbjrentry.getFylbx();//养老保险
            BigDecimal fyybx = wfzSbjrentry.getFyybx();//医疗保险
            BigDecimal fsybx = wfzSbjrentry.getFsybx();//生育保险
            BigDecimal fssbx = wfzSbjrentry.getFssbx();//失业保险
            BigDecimal fgsbx = wfzSbjrentry.getFgsbx();//工伤保险
            BigDecimal fgryl = wfzSbjrentry.getFgryl();//个人养老
            BigDecimal fgryy = wfzSbjrentry.getFgryy();//个人医疗
            BigDecimal fgrsy = wfzSbjrentry.getFgrsy();//个人失业
            BigDecimal fylbxce = wfzSbjrentry.getFylbxce();//养老保险差额
            BigDecimal fyybxce = wfzSbjrentry.getFyybxce();//医疗保险差额
            BigDecimal fsybxce = wfzSbjrentry.getFsybxce();//生于保险差额
            BigDecimal fssbxce = wfzSbjrentry.getFssbxce();//失业保险差额
            BigDecimal fgsbxce = wfzSbjrentry.getFgsbxce();//工伤保险差额
            String fjsfs = wfzSbjrentry.getFjsfs();//组织间结算方式
            String fcbzxxz = wfzSbjrentry.getFcbzxxz();//成本中心属性
            Long fisdy = wfzSbjrentry.getFisdy();//是否当月缴纳
            Long fislz = wfzSbjrentry.getFislz();//是否离职员工
            String fvourtype1 = wfzSbjrentry.getFvourtype();//凭证字

            SbjrEntryInfo sbjrentryInfo = new SbjrEntryInfo();
            sbjrentryInfo.setCostCenter(fcostnumber);
            sbjrentryInfo.setCostcompany(fcostcompany);
            sbjrentryInfo.setYlbx(fylbx);
            sbjrentryInfo.setYybx(fyybx);
            sbjrentryInfo.setSybx(fsybx);
            sbjrentryInfo.setSsbx(fssbx);
            sbjrentryInfo.setGsbx(fgsbx);
            sbjrentryInfo.setGryl(fgryl);
            sbjrentryInfo.setGryy(fgryy);
            sbjrentryInfo.setGrsy(fgrsy);
            sbjrentryInfo.setYlbxce(fylbxce);
            sbjrentryInfo.setYybxce(fyybxce);
            sbjrentryInfo.setSybxce(fsybxce);
            sbjrentryInfo.setSsbxce(fssbxce);
            sbjrentryInfo.setGsbxce(fgsbxce);
            sbjrentryInfo.setJsfs(fjsfs);
            sbjrentryInfo.setCbzxxz(fcbzxxz);
            sbjrentryInfo.setIsdy(fisdy);
            sbjrentryInfo.setIslz(fislz);
            sbjrentryInfo.setVourType(fvourtype1);

            entry.add(sbjrentryInfo);

        }
        sbjrInfo.setEntry(entry);

        //转为JSon
        String json = JSONObject.toJSONString(sbjrInfo);
        return json;
    }
}
